#include <stdio.h>
#include <iostream>
#include "Alfabeto.h"

using namespace std;

Alfabeto::Alfabeto() {
    for(int i = 0; i <= tamanio; i++)
    {
        alfabeto[i] = (unsigned char)i;
    }
}

Alfabeto::Alfabeto(unsigned char* chars_mas_frecuentes) {
}

//Imprime el alfabeto
void Alfabeto::imprimir() { 
    cout << endl << "Imprimiendo alfabeto" << endl;
    for (int i = 0 ; i <= tamanio ; i++){
        cout << alfabeto[i];
    }
    cout << endl;
}


int Alfabeto::buscar(unsigned char * caracter){
    for (int i = 0 ; i <= tamanio ; i++){
        if ( alfabeto[i] == *caracter ) return i;
    }
    return -1;
}


void Alfabeto::swap(unsigned char *elem1,unsigned char *elem2){
    unsigned char temp = *elem1;
    *elem1 = *elem2;
    *elem2 = temp;
}

//Recibe la posicion del elemento a mover al principio para no tener que buscarlo nuevamente
void Alfabeto::mover_al_frente(int posicion){
    if ( posicion == 0 ) return; //Nada para intercambiar
    unsigned char elemento = alfabeto[posicion];
    for (int i = posicion ; i > 0 ; i--){
        Alfabeto::swap( &alfabeto[i], &alfabeto[i-1]); 
    }
}

//Procedimiento inverso a mover al frente para la vuelta del MTF
int Alfabeto::obtener_char(int posicion,unsigned char* ch){
        
        if ( 0 < posicion < 255  ){
            *ch = alfabeto[posicion];
            return 0;
        }
    return -1;
    
}

//N es el tamaño de la cadena
int Alfabeto::reordenar_segun_string(unsigned char *cadena,short N){
    
    int i =0;
    unsigned char ch;
    int pos ;
    
    //desde el ultimo char de la cadena voy moviendo al frente
    for (i=N;i>=0;i--){
        ch=cadena[i];
        pos = Alfabeto::buscar(&ch);
        Alfabeto::mover_al_frente(pos);
    }    
    return 0;
}
